/*
小明的飞机快要赶不上了！
幸好大厅的路上有一些传送带。每个传送带都有一定的速度，传送带之间没有重叠。
小明自己行走的速度为w，如果传送带的速度为v的话，在传送带上走的速度就是w + v。
但是小明还是很着急，所以他决定跑一段时间t。他跑的速度是r，那么如果传送带的速度为v的话，在传送带上跑的速度就是r + v。
对于时间t，他不一定要连续跑，可以走走再跑。也不一定非要跑够t。
问小明至少需要多少时间才能到达终点。

输入第一行为用例数T，1 <= T <= 40。
每一组用例的第一行包含五个整数：
X：为大厅的长度，小明起始位于0，终点是X，1 <= X <= 1000000
W：为走路的速度
R：为跑步的速度，1 <= W < R <= 100
	t：最多能跑t秒，1 <= t <= 1000000
	n：传送带的个数
	接下来的n行，表示n个传送带的详细信息。每行包含三个整数：Bi，Ei，Vi，分别表示传送带的起始位置、终止位置和速度，0 <= Bi < Ei <= X，1 <= vi <= 100。任意两个传送带都不相交。
	输出包含一个数字，表示至少需要多少时间。输出四舍五入到6位小数。
*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif



#include <stdio.h>
#include <stdlib.h>

#define MAX 1000000

#define BOOL	int 
#define TRUE	1
#define FALSE	0

typedef struct Belt
{
	double Li;		//长度
	double Vi;		//速度
}Belt;

static inline int cmp(const void *a, const void *b)
{
	return ((Belt *)a)->Vi > ((Belt *)b)->Vi; //按照速度从大到小排序
}

Belt belt[MAX];

int main(int argc, char **argv, char **envp)
{
	int i, j;
	int T;
	double X;	//为大厅的长度，小明起始位于0，终点是X，1<=X<=1000000
	double W;	//为走路的速度
	double R;	//为跑步的速度，1<=W<R<=100
	double t;	//最多能跑t秒，1<=t<=1000000
	int n;	//传送带的个数

	int Bi, Ei;

	double lengthOfAllBelt = 0;
	double remainRunTime = 0;
	double remainBeltLength = 0;
	double allTime = 0.0;
	double runTime = 0;

	scanf("%d", &T);
	for (i = 0; i < T; i++)
	{
		scanf("%lf%lf%lf%lf%d", &X, &W, &R, &t, &n);
		for (j = 0, lengthOfAllBelt = 0.0; j < n; j++)
		{
			scanf("%d%d%lf", &Bi, &Ei, &belt[j].Vi);
			belt[j].Li = Ei - Bi;
			lengthOfAllBelt += belt[j].Li;
		}
		belt[n].Li = X - lengthOfAllBelt;//将地面看做是速度为0的传送带
		belt[n].Vi = 0.0;

		qsort(belt, n + 1, sizeof(belt[0]), cmp);

		remainRunTime = t;

		for (j = 0, allTime = 0.0; j < n + 1; j++)
		{
			runTime = belt[j].Li / (belt[j].Vi + R);
			if (remainRunTime == 0.0) // 不能跑了
			{
				allTime += belt[j].Li / (belt[j].Vi + W);
			}
			else if (remainRunTime < runTime) // 跑不完一个传送带
			{
				allTime += remainRunTime;
				remainBeltLength = belt[j].Li - (belt[j].Vi + R) * remainRunTime;
				allTime += remainBeltLength / (belt[j].Vi + W);
				remainRunTime = 0.0;
			}
			else// 可以跑完一个传送带
			{
				allTime += runTime;
				remainRunTime -= runTime;
			}
		}
		printf("%.6lf\n", allTime);
	}
	return 0;
}